/**
 * @file 全局工具方法
 *
 * @author liubin29(liubin29@baidu.com)
 * 2016年4月14日
 */

/**
 * 格式化时间
 *
 * @param  {Object} date 日期对象
 * @param  {string} fmt 格式
 * @return {string} value
 */
export function formatDate(date, fmt) {
    if (!(date instanceof Date)) {
        date = new Date(date);
    }
    let o = {
        'M+': date.getMonth() + 1,
        'd+': date.getDate(), // 日
        'h+': date.getHours(), // 小时
        'm+': date.getMinutes(), // 分
        's+': date.getSeconds(), // 秒
        'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
        'S': date.getMilliseconds() // 毫秒
    };
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    for (let k of Object.keys(o)) {
        if (new RegExp('(' + k + ')').test(fmt)) {
            fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
        }
    }
    return fmt;
}

/**
 * 使用增加script标签的方式异步加载js
 *
 * @param  {string} url 要加载的js地址
 * @return {Object} Promise对象
 */
export function loadJS(url) {
    return new Promise((resolve, reject) => {
        let head = document.getElementsByTagName('head')[0];
        let script = document.createElement('script');
        script.loaded = false;
        script.onreadystatechange = function () {
            if (this.readyState === 'complete' && !script.loaded) {
                script.loaded = true;
                resolve();
            }
        };
        script.onload = function () {
            if (!script.loaded) {
                script.loaded = true;
                resolve();
            }
        };
        script.src = url;
        head.appendChild(script);
    });
}

/**
 * 获取问号后面参数信息
 *
 * @param  {string} url 路由地址
 * @return {Object} query对象
 */
export function parseQuery(url) {

    let locse = url.split('?');
    let search = locse[1] ? locse[1] : locse[0];
    let pairs = search.split('&');
    let result = {};

    pairs.forEach(function (pair) {
        pair = pair.split('=');
        if (pair[0].length > 0) {
            let resultPair = '';
            try {
                resultPair = decodeURIComponent(pair[1]) || '';
            }
            catch (e) {
                return;
            }
            result[pair[0]] = resultPair;
        }
    });

    return result;
}

/**
 * 为数字增加千分位
 *
 * @param  {number|string} num 待处理数据
 * @return {string} 返回数据
 */
export function numAddComma(num) {
    return (num + '').replace(/(\d{1,3})(?=(\d{3})+(?:$|\D))/g, '$1,');
}

/**
 * 为小数增加千分位，同时保留指定为数（默认保留2位）
 *
 * @param  {number|string} num 待处理数据
 * @param  {number}        x 保留的位数
 * @return {string}        返回数据
 */
export function decimalAddComma(num, x = 2) {
    num = (+num).toFixed(x);
    let numArray = (num + '').split('.');
    return numAddComma(numArray[0]) + '.' + numArray[1];
}

/**
 * 系列化参数
 *
 * @param {Object} obj 一个待序列化的对象
 * @return {string} 序列化后的字符串
 */
export function serializeParams(obj) {
    let resStr = '';
    for (let key of Object.keys(obj)) {
        let val = obj[key];
        resStr += `&${key}=${val}`;
    }
    return resStr.substring(1);
}